/*
 * Copyright (c) 2011-2019 Contributors to the Eclipse Foundation
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 * which is available at https://www.apache.org/licenses/LICENSE-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 */

package examples;

import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.eventbus.*;
import io.vertx.core.http.ClientAuth;
import io.vertx.core.net.JksOptions;

/**
 * Created by tim on 09/01/15.
 */
public class EventBusExamples {

  public void example0_5(Vertx vertx) {
    EventBus eb = vertx.eventBus();
  }

  public void example1(Vertx vertx) {
    EventBus eb = vertx.eventBus();

    eb.consumer("news.uk.sport", message -> {
      System.out.println("I have received a message: " + message.body());
    });
  }

  public void example2(Vertx vertx) {
    EventBus eb = vertx.eventBus();

    MessageConsumer<String> consumer = eb.consumer("news.uk.sport");
    consumer.handler(message -> {
      System.out.println("I have received a message: " + message.body());
    });
  }

  public void example3(MessageConsumer<String> consumer) {
    consumer.completion().onComplete(res -> {
      if (res.succeeded()) {
        System.out.println("The handler registration has reached all nodes");
      } else {
        System.out.println("Registration failed!");
      }
    });
  }

  public void example4(MessageConsumer<String> consumer) {
    consumer
      .unregister()
      .onComplete(res -> {
        if (res.succeeded()) {
          System.out.println("The handler un-registration has reached all nodes");
        } else {
          System.out.println("Un-registration failed!");
        }
      });
  }

  public void example5(EventBus eventBus) {
    eventBus.publish("news.uk.sport", "Yay! Someone kicked a ball");
  }

  public void example6(EventBus eventBus) {
    eventBus.send("news.uk.sport", "Yay! Someone kicked a ball");
  }

  public void example8(EventBus eventBus) {
    MessageConsumer<String> consumer = eventBus.consumer("news.uk.sport");
    consumer.handler(message -> {
      System.out.println("I have received a message: " + message.body());
      message.reply("how interesting!");
    });
  }

  public void example9(EventBus eventBus) {
    eventBus
      .request("news.uk.sport", "Yay! Someone kicked a ball across a patch of grass")
      .onComplete(ar -> {
        if (ar.succeeded()) {
          System.out.println("Received reply: " + ar.result().body());
        }
      });
  }

  public void example12() {
    VertxOptions options = new VertxOptions();
    Vertx
      .clusteredVertx(options)
      .onComplete(res -> {
        if (res.succeeded()) {
          Vertx vertx = res.result();
          EventBus eventBus = vertx.eventBus();
          System.out.println("We now have a clustered event bus: " + eventBus);
        } else {
          System.out.println("Failed: " + res.cause());
        }
      });
  }

  public void example13() {
    VertxOptions options = new VertxOptions()
        .setEventBusOptions(new EventBusOptions()
            .setSsl(true)
            .setKeyCertOptions(new JksOptions().setPath("keystore.jks").setPassword("wibble"))
            .setTrustOptions(new JksOptions().setPath("keystore.jks").setPassword("wibble"))
            .setClientAuth(ClientAuth.REQUIRED)
        );

    Vertx
      .clusteredVertx(options)
      .onComplete(res -> {
        if (res.succeeded()) {
          Vertx vertx = res.result();
          EventBus eventBus = vertx.eventBus();
          System.out.println("We now have a clustered event bus: " + eventBus);
        } else {
          System.out.println("Failed: " + res.cause());
        }
      });
  }

  public void example14() {
    VertxOptions options = new VertxOptions()
        .setEventBusOptions(new EventBusOptions()
            .setClusterPublicHost("whatever")
            .setClusterPublicPort(1234)
        );

    Vertx
      .clusteredVertx(options)
      .onComplete(res -> {
        if (res.succeeded()) {
          Vertx vertx = res.result();
          EventBus eventBus = vertx.eventBus();
          System.out.println("We now have a clustered event bus: " + eventBus);
        } else {
          System.out.println("Failed: " + res.cause());
        }
      });
  }

  public void example10(EventBus eventBus, MessageCodec myCodec) {

    eventBus.registerCodec(myCodec);

    DeliveryOptions options = new DeliveryOptions().setCodecName(myCodec.name());

    eventBus.send("orders", new MyPOJO(), options);
  }

  public void example11(EventBus eventBus, MessageCodec myCodec) {

    eventBus.registerDefaultCodec(MyPOJO.class, myCodec);

    eventBus.send("orders", new MyPOJO());
  }

  public void headers(EventBus eventBus) {
    DeliveryOptions options = new DeliveryOptions();
    options.addHeader("some-header", "some-value");
    eventBus.send("news.uk.sport", "Yay! Someone kicked a ball", options);
  }

  class MyPOJO {

  }
}
